ํ๋ก์ธ์ค
ํ๋ก์ธ์ค๋ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ(ํน์ ๋งค์ฒด์ ์ ์ฅ๋ ์ค๋ธ์ ํธ ์ฝ๋)
ํ์ง๋ง ํ๋ก์ธ์ค๋ ์ฌ์ฉ ์ค์ธ ํ์ผ, ๋๊ธฐ ์ค์ธ ์๊ทธ๋, ์ปค๋ ๋ด๋ถ ๋ฐ์ดํฐ, ํ๋ก์ธ์ ์ํ, ํ๋ ์ด์์ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ, ์คํ ์ค์ธ ํ๋ ์ด์์ ์ค๋ ๋ ์ ๋ณด, ์ ์ญ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ฐ์ดํฐ ๋ถ๋ถ ๋ฑ ๋ชจ๋ ์์์ ํฌํจํ๋ ๊ฐ๋
์ฌ์ค์ ํ๋ก์ธ์ค๋ ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ์คํํ๋ฉด์ ์๊ธฐ๋ ๋ชจ๋ ๊ฒฐ๊ณผ๋ฌผ
์ปค๋์ ์ด ๋ชจ๋ ์ธ๋ถ ์ฌํญ์ ํฌ๋ช ํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํด์ผ ํจ
์คํ ์ค์ธ ์ค๋ ๋(๋ณดํต ์ค์ฌ์ ์ค๋ ๋๋ผ ์นญํ๋)๋ ํ๋ก์ธ์ค ๋ด๋ถ์์ ๋์ํ๋ ๊ฐ์ฒด
๊ฐ ์ค๋ ๋๋ ๊ฐ๋ณ์ ์ธ ํ๋ก๊ทธ๋จ ์นด์ดํฐ์ ํ๋ก์ธ์ค ์คํ, ํ๋ก์ธ์ ๋ ์ง์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์์
์ปค๋์ ํ๋ก์ธ์ค๊ฐ ์๋๋ผ ์ด๋ฌํ ๊ฐ๊ฐ์ ์ค๋ ๋๋ฅผ ์ค์ผ์ค๋ง ํจ
์ ํต์ ์ธ ์ ๋์ค ์์คํ
: ํ๋ก์ธ์ค๊ฐ ํ๋์ ์ค๋ ๋๋ก ๊ตฌ์ฑ
ํ๋ ์์คํ
: ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ก ๊ตฌ์ฑ๋ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋จ ๋ง์ฐ
๋ฆฌ๋
์ค๋ ๋
ํนํ ๋ฐฉ์์ผ๋ก ์ค๋ ๋ ๊ตฌํ
๋ฆฌ๋
์ค๋ ํ๋ก์ธ์ค์ ์ค๋ ๋ ๊ตฌ๋ถ ์ํจ
๋ฆฌ๋
์ค์์ ์ค๋ ๋๋ ์กฐ๊ธ ํน๋ณํ ํํ์ ํ๋ก์ธ์ค์ผ ๋ฟ
ํ๋ ์ด์์ฒด์ ์์ ํ๋ก์ธ์ค๋ ๊ฐ์ ํ๋ก์ธ์์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ผ๋ ๋ ๊ฐ์ง ๊ฐ์ ํ๊ฒฝ ์ ๊ณต
๊ฐ์ ํ๋ก์ธ์๋ ์ค์ ๋ก ์๋ฐฑ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ํ๋ก์ธ์๋ฅผ ๊ณต์ ํ๋ ์ํฉ์ด๋ผ๋, ํ๋ก์ธ์ค๊ฐ ํผ์ ์์คํ
์ ์ฌ์ฉํ๋ ๋ฏํ ๊ฐ์ ํ๊ฒฝ ์ ๊ณต
๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ํ๋ก์ธ์ค๊ฐ ์์คํ
์ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํผ์ ์ฐจ์งํ๊ณ ์๋ ๊ฒ์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค
์ค๋ ๋๋ ๊ฐ์ ๊ณ ์ ํ ๊ฐ์ ํ๋ก์ธ์๋ฅผ ํ ๋น๋ฐ์ง๋ง ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ ๊ณต์ ํจ
ํ๋ก๊ทธ๋จ ์์ฒด๋ ํ๋ก์ธ์ค๊ฐ ์๋
ํ๋ก์ธ์ค๋ ์๋ ์ค์ธ ํ๋ก๊ทธ๋จ ๋ฐ ๊ทธ์ ๊ด๋ จ๋ ์์์ ๋ปํจ
๊ฐ์ ํ๋ก๊ทธ๋จ ์คํํ๋ ๋ ์ด์์ ํ๋ก์ธ์ค ์กด์ฌ ๊ฐ๋ฅ
์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ด ํ์ผ ์ฌ์ฉ, ์ฃผ์ ๊ณต๊ฐ ๋ฑ์ ์์ ๊ณต์ ๊ฐ๋ฅ
ํ๋ก์ธ์ค๋ ์์ฑ๋๋ฉด์ ์์ ์์
๋ฆฌ๋
์ค์์๋ ๊ธฐ์กด ํ๋ก์ธ์ค๋ฅผ ๋ณต์ฌํด์ ์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋๋ fork() ์์คํ
ํธ์ถ์ ํตํด ํ๋ก์ธ์ค๊ฐ ๋ง๋ค์ด์ง
fork()๋ฅผ ํธ์ถํ๋ ํ๋ก์ธ์ค๋ ๋ถ๋ชจ ํ๋ก์ธ์ค, ์๋ก ๋ง๋ค์ด์ง ํ๋ก์ธ์ค๋ ์์ ํ๋ก์ธ์ค๊ฐ ๋จ
๋ถ๋ชจ ํ๋ก์ธ์ค๋ fork() ์์คํ
ํธ์ถ์ด ๋ฐํ๋ ์ง์ ์์ ์คํ์ ๊ณ์, ์์ ํ๋ก์ธ์ค๋ ๊ฐ์ ์์น์์ ์คํ ์์
์ฆ, fork() ์์คํ
ํธ์ถ์ ๋ถ๋ชจ ํ๋ก์ธ์ค์์ ํ ๋ฒ, ์์ ํ๋ก์ธ์ค์์ ํ ๋ฒ, ์ด ๋ ๋ฒ ๋ฐํ์ด ์ผ์ด๋จ
๋๊ฐ์ ๊ฒฝ์ฐ forkํ ์งํ ๋ค๋ฅธ ์ ํ๋ก๊ทธ๋จ ์คํ
exec() ๊ณ์ด์ ํจ์๋ฅผ ํธ์ถํด ์๋ก์ด ์ฃผ์ ๊ณต๊ฐ ๋ง๋ค๊ณ ์ ํ๋ก๊ทธ๋จ ๋ถ๋ฌ๋ค์ผ ์ ์์
๋ฆฌ๋
์ค ์ปค๋์ fork() ์์คํ
ํธ์ถ์ ์ค์ ๋ก๋ clone() ์์คํ
ํธ์ถ์ ์ด์ฉํด ๊ตฌํ๋จ
ํ๋ก๊ทธ๋จ์ exit() ์์คํ
ํธ์ถ์ ํตํด ์ข
๋ฃ๋จ
์ด ํจ์๋ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ๊ณ ํ๋ก์ธ์ค์ ๋ชจ๋ ์์ ๋ฐ๋ฉ
๋ถ๋ชจ ํ๋ก์ธ์ค๋ ํน์ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ wait4() ์์คํ
ํธ์ถ์ ์ด์ฉํด ์์ ํ๋ก์ธ์ค์ ์ข
๋ฃ ์ํ ํ์ธ ๊ฐ๋ฅ
- ์ปค๋์ด ๊ตฌํํ๋ ๊ฒ์ wait4() ์์คํ ํธ์ถ. ๋ฆฌ๋ ์ค ์์คํ ์ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ผ๋ฐ์ ์ธ wait(), waitpid(), wait3(), wait4() ํจ์๋ฅผ ์ ๊ณตํจ. ๊ฐ ํจ์๋ ์กฐ๊ธ์ฉ ๋ค๋ฅด์ง๋ง ๋ชจ๋ ์ข ๋ฃ๋ ํ๋ก์ธ์ค์ ์ํ ์ ๋ณด ์ ๊ณตํจ
- ํ๋ก์ธ์ค๋ฅผ ๋ค๋ฅธ ๋ง๋ก ํ์คํฌ(task, ์์ )๋ผ๊ณ ๋ ๋ถ๋ฆ. ๋ฆฌ๋ ์ค ์ปค๋ ๋ด๋ถ์์๋ ํ๋ก์ธ์ค๋ฅผ ํ์คํฌ๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒฝ์ฐ ๋ง์. ๋ณดํต ์ปค๋ ๊ด์ ์์ ํ๋ก์ธ์ค ์ง์นญ ์ ํ์คํฌ๋ผ๋ ์ฉ์ด ์ฌ์ฉ
ํ๋ก์ธ์ค ์์ ์์ ํ์คํฌ ๊ตฌ์กฐ์ฒด
์ปค๋์ ํ๋ก์ธ์ค ๋ชฉ๋ก์ ํ์คํฌ ๋ฆฌ์คํธ๋ผ๊ณ ๋ถ๋ฅด๋ ํํ ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ํํ๋ก ์ ์ฅ(ํ์คํฌ ๋ฐฐ์ด๋ก ๋ถ๋ฅด๋ ๊ฒฝ์ฐ๋ ์์ง๋ง ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ด๋ฏ๋ก ํ์คํฌ ๋ฆฌ์คํธ๊ฐ ์ ์ )
ํ์คํฌ ๋ฆฌ์คํธ์ ๊ฐ ํญ๋ชฉ์ <linux/sched.h>์ ์ ์๋ struct task_struct ํ์์ผ๋ก ๋์ด ์์ผ๋ฉฐ, ํ๋ก์ธ์ค ์์ ์๋ผ๊ณ ๋ถ๋ฆ
ํ๋ก์ธ์ค ์์ ์์๋ ํด๋น ํ๋ก์ธ์ค์ ๊ด๋ จ๋ ๋ชจ๋ ์ ๋ณด๊ฐ ๋ค์ด ์์
task_struct ๊ตฌ์กฐ์ฒด๋ 32๋นํธ ์์คํ
์์ ์ฝ 1.7KB์ ์๋นํ ํฐ ๊ตฌ์กฐ์ฒด
์ปค๋์ด ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ ์ ์ ๊ฐ์ ์ ์ด ํฌ๊ธฐ๋ ์์ ๊ฒ
ํ๋ก์ธ์ค ์์ ์์๋ ์ฌ์ฉ ์ค์ธ ํ์ผ, ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ, ๋๊ธฐ ์ค์ธ ์๊ทธ๋, ํ๋ก์ธ์ค์ ์ํ ๋ฑ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ์ค๋ช ํ๋ ๋ง์ ์ ๋ณด๊ฐ ๋ค์ด ์์
ํ๋ก์ธ์ค ์์ ์์ ํ ๋น
task_struct ๊ตฌ์กฐ์ฒด๋ ๊ฐ์ฒด ์ฌ์ฌ์ฉ ๋ฐ ์บ์ ์ปฌ๋ฌ๋ง ๊ธฐ๋ฅ์ ์ง์ํ๋ ์ฌ๋ฉ ํ ๋น์slab allocator๋ฅผ ์ฌ์ฉํด ํ ๋น
2.6 ์ปค๋ ์ด์ ์๋ task_struct ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ ํ๋ก์ธ์ค์ ์ปค๋ ์คํ ๋ ๋ถ๋ถ์ ์ ์ฅํ์
(์ด๋ ๊ฒ ํ๋ฉด x86์ฒ๋ผ ๋ ์ง์คํฐ๊ฐ ์ ์ ์ํคํ
์ฒ์์๋ ๊ตฌ์กฐ์ฒด ์์น๋ฅผ ์ ์ฅํ๋ ๋ ์ง์คํฐ๋ฅผ ๋ณ๋๋ก ์ฌ์ฉํ์ง ์๊ณ ๋ ์คํ ํฌ์ธํฐ ํตํด ํ๋ก์ธ์ค ์์ ์ ์์น ๊ณ์ฐ ๊ฐ๋ฅํ์์)
์ด์ ๋ ์ฌ๋ฉ ํ ๋น์ ์ด์ฉ ๋์ ์ผ๋ก ํ๋ก์ธ์ค ์์ ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ thread_info๋ผ๋ ์๋ก์ด ๊ตฌ์กฐ์ฒด๋ฅผ ์คํ์ด ์๋์ชฝ์ผ๋ก ํ์ฅ ์ ์คํ ๋ฐ๋ฐ๋ฅ, ์์ชฝ์ผ๋ก ํ์ฅ ์ ์คํ ๊ผญ๋๊ธฐ์ ๋์ ๋
- ๋ ์ง์คํฐ ๋ถ์กฑ ์์คํ ์ํด์๋ง ์๋๋ผ thread_info ๊ตฌ์กฐ์ฒด ์ฌ์ฉ์ผ๋ก ์ด์ ๋ธ๋ฆฌ ์ฝ๋์์ ์ฌ์ฉํ๋ ๊ฐ ์คํ์ ๊ณ์ฐ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ํจ
๊ฐ ํ์คํฌ์ thread_info ๊ตฌ์กฐ์ฒด๋ ํ๋ก์ธ์ค ์คํ์ ์ ์ผ ๋๋ถ๋ถ์ ํ ๋น๋จ
๊ตฌ์กฐ์ฒด์ task ํฌ์ธํฐ๊ฐ ํ์คํฌ์ ์ค์ task_struct ๊ตฌ์กฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด
ํ๋ก์ธ์ค ์์ ์ ์ ์ฅ
์์คํ
์ ๊ณ ์ ํ ํ๋ก์ธ์ค ์ธ์ ๋ฒํธ(PID)๋ฅผ ์ด์ฉํด ํ๋ก์ธ์ค ๊ตฌ๋ณํจ
PID๋ pid_t๋ผ๋ ๋ถ์ ํopaque์ ์ซ์ ๊ฐ์ผ๋ก, ๋ณดํต์ ์ค์ ๋ก int ํ ์ฌ์ฉํจ
ํ์ง๋ง ์ด๊ธฐ ์ ๋์ค ๋ฐ ๋ฆฌ๋
์ค์์ ํ์ ํธํ์ฑ ๋ฌธ์ ๋ก PID ์ต๋๊ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก (short int ์ต๋๊ฐ์ธ) 32,768์ด๋ฉฐ, ์ด ๊ฐ์ ์ ํ์ ์ผ๋ก(<linux/thread.h> ํ์ผ์ ํตํด) 400๋ง์ผ๋ก ์ํฅ ์กฐ์ ๊ฐ๋ฅ
์ปค๋์ PID ๊ฐ์ ํ๋ก์ธ์ค ์์ ์์ pid ํญ๋ชฉ์ ์ ์ฅ
- ๋ถ์ ํ์ ์ค์ ๋ฌผ๋ฆฌ์ ์ธ ํํํ ์๋ ค์ง์ง ์์๊ฑฐ๋ ์ค์ ํํํ ๋ ธ์ถํ ํ์ ์์ ๋ ์ฌ์ฉํ๋ ํ์ด๋ค.
๊ทผ๋ณธ์ ์ผ๋ก PID ์ต๋๊ฐ์ ์์คํ
์ ๋์์ ์กด์ฌํ ์ ์ด์ด ์ต๋ ํ๋ก์ธ์ค ์
์ผ๋ฐ ๋ฐ์คํฌํ ์์คํ
์ 32,768๊ฐ ์ถฉ๋ถํ์ง๋ง, ๋์ฉ๋ ์๋ฒ์์๋ ๋ ๋ง์ ํ๋ก์ธ์ค ํ์ํ ์ ์์
์ต๋๊ฐ์ด ๋ฎ์์๋ก ์ํญ์ ๋์ด ๋ค์ ๋ฎ์ PID๊ฐ ํ ๋น๋๋ ์ํฉ ๋นจ๋ฆฌ ๋์์ด
=> ์ด ๊ฒฝ์ฐ ๋์ค์ ๋ง๋ ํ๋ก์ธ์ค PID๊ฐ ํฐ ๊ฐ์ ๊ฐ๋๋ค๋ ์ ์ฉํ ์ ๋ณด ์ฌ๋ผ์ง
์ค๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ์ ํธํ์ฑ ๊ณ ๋ คํ ํ์ ์๋ค๋ฉด, ์์คํ ๊ด๋ฆฌ์๊ฐ /proc/sys/kernel/pid_max ๊ฐ ์์ ํด ์ต๋๊ฐ ์ฆ๊ฐ ๊ฐ๋ฅ
์ปค๋ ๋ด๋ถ์์ ํ์คํฌ์ ์ ๊ทผํ ๋ ๋ณดํต task_struct ๊ตฌ์กฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํจ
๋ฐ๋ผ์ ํ์ฌ ์คํ ์ค์ธ ํ์คํฌ์ ํ๋ก์ธ์ค ์์ ์๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ๋ ๋ฐฉ๋ฒ ํ์ => current ๋งคํฌ๋ก๊ฐ ์ด ์ญํ ์ ํจ
current ๋งคํฌ๋ก : ์ํคํ
์ฒ๋ณ๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋จ
์ด๋ค ์ํคํ
์ฒ๋ ํ์ฌ ์คํ ์ค์ธ ํ๋ก์ธ์ค์ task_struct ํฌ์ธํฐ๋ฅผ ๋ ์ง์คํฐ์ ์ ์ฅํด ๋๊ณ ์ ๊ทผํ๋ ํจ์จ์ ์ธ ๋ฐฉ์์ ์ธ ์ ์์
(๋ ์ง์คํฐ๋ฅผ ์๊ปด์ผ ํ๋)x86 ๊ฐ์ ์ํคํ
์ฒ์์๋ thread_info ๊ตฌ์กฐ์ฒด๊ฐ ์ปค๋ ์คํ์ ์ ์ฅ๋๋ค๋ ์ฌ์ค์ ์ด์ฉํด thread_info ๊ตฌ์กฐ์ฒด์ ์์น๋ฅผ ๊ณ์ฐํด๋ด๊ณ , ์ด๋ฅผ ํตํด task_struct์ ์์น ์์๋
x86์ current ๋งคํฌ๋ก๋ ์คํ ํฌ์ธํฐ์ ํ์ 13๋นํธ๋ฅผ ๋ฎ์ด์ฐ๋ ๋ฐฉ์์ผ๋ก thread_info ๊ตฌ์กฐ์ฒด ์์น ๊ณ์ฐํด๋
current_thread_info() ํจ์๊ฐ ์ด ์ญํ ์ ๋ด๋นํจ
movl $-8192, %eax
andl %esp, %esp
์ด ์ฝ๋๋ ์คํ ํฌ๊ธฐ๊ฐ 8KB๋ผ๊ณ ๊ฐ์ ํจ. 4KB ์คํ ์ฌ์ฉ ์ 8192 ๋์ 4096์ ์ฌ์ฉ.
๋ง์ง๋ง์ผ๋ก, ์ด current ๋งคํฌ๋ก๋ thread_info์ ํญ๋ชฉ์ ์ฐธ์กฐํด task_struct ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐํ
current_thread_info()->task;
IBM์ RISC๊ธฐ๋ฐ PowerPC์์๋ ์ด์ ๋ค๋ฅธ ๋ฐฉ์ ์ฌ์ฉํ๋๋ฐ, ๋ ์ง์คํฐ์ ํ์ฌ task_struct ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ์ ์ฌ์ฉํจ
๋ฐ๋ผ์ PPC์์ current ๋งคํฌ๋ก๋ r2 ๋ ์ง์คํฐ์ ์ ์ฅ๋ ๊ฐ์ ๋ฐํํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
ํ๋ก์ธ์ค ์์ ์์ ์ ๊ทผํ๋ ๊ฒ์ ๋งค์ฐ ๋น๋ฒํ๊ณ ์ค์ํ ์์
์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ณ๋ ๋ ์ง์คํฐ๋ฅผ ํ ๋นํ ๋งํ ์์
์ด๋ผ๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ
ํ๋ก์ธ์ค ์ํ
ํ๋ก์ธ์ค ์์ ์์ state ํญ๋ชฉ์ ํ์ฌ ํ๋ก์ธ์ค๊ฐ ์ฒํ ํ๊ฒฝ์ ์๋ ค์ค
์์คํ
์ ํ๋ก์ธ์ค๋ ์ ํํ ๋ค์ฏ ๊ฐ์ง ์ํ ์ค ํ๋์ ์์
๊ฐ ์ํ๊ฐ์ ๋ค์ ๋ค์ฏ ๊ฐ์ง ํ๋๊ทธ๋ฅผ ์ด์ฉํด ํํ
- TASK_RUNNING - ํ๋ก์ธ์ค๊ฐ ์คํ ๊ฐ๋ฅํ ์ํ. ํ์ฌ ์คํ ์ค์ด๊ฑฐ๋ ์คํ๋๊ธฐ ์ํด ์คํ ๋๊ธฐ์ด์ ์๋ ์ํ. ์ฌ์ฉ์ ๊ณต๊ฐ์์ ์คํ๋ ํ๋ก์ธ์ค๋ ์ด ์ํ๋ง ๊ฐ์ง ์ ์์. ์ปค๋ ๊ณต๊ฐ์์ ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ ์ด ์ํ์ ์ํจ.
- TASK_INTERRUPTIBLE - ํ๋ก์ธ์ค๊ฐ ํน์ ์กฐ๊ฑด์ด ๋ฐ์ํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์ฌ๋ ์ค์(์ค๋จ). ๊ธฐ๋ค๋ฆฌ๋ ์กฐ๊ฑด์ด ๋ฐ์ํ๋ฉด ์ปค๋์ ํ๋ก์ธ์ค์ ์ํ๋ฅผ TASK_RUNNING์ผ๋ก ๋ฐ๊พผ๋ค. ํ๋ก์ธ์ค๊ฐ ์๊ทธ๋์ ๋ฐ์ ๊ฒฝ์ฐ์๋ ์กฐ๊ฑด์ ์๊ด์์ด ์คํ ๊ฐ๋ฅํ ์ํ๋ก ๋ฐ๋.
- TASK_UNINTERRUPTIBLE - ์๊ทธ๋์ ๋ฐ์๋ ์คํ ๊ฐ๋ฅ ์ํ๋ก ๋ฐ๋์ง ์๋ ์ ์ ์ธํ๋ฉด TASK_INTERRUPTIBLE ์ํ์ ๊ฐ์. ์ด ์ํ๋ ํ๋ก์ธ์ค๊ฐ ๋ฐฉํด๋ฐ์ง ์๊ณ ํน์ ์กฐ๊ฑด์ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๊ฒฝ์ฐ, ๊ธฐ๋ค๋ฆฌ๋ ์กฐ๊ฑด์ด ๊ธ๋ฐฉ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ. ์ด ์ํ์ ์๋ ํ์คํฌ๋ ์๊ทธ๋์ ์๋ต ์ ํ๋ฏ๋ก(์ด๊ฒ ๋๋ฌธ์ ps(1) ๋ช ๋ น ๊ฒฐ๊ณผ์ D ์ํ๋ก ใ ์๋๋ ์ฃฝ์ผ ์ ์๋ ํ๋ก์ธ์ค๊ฐ ๋ฑ์ฅํ๋ ์ด์ . ์์ ์ด ์๊ทธ๋์ ์๋ต ์ ํ๋ฏ๋ก SIGKILL ์๊ทธ๋ ๋ณด๋ผ ์ ์์. ๊ฒ๋ค๊ฐ, ์์ ์ข ๋ฃ๊ฐ ๊ฐ๋ฅํด๋ ์ค์ํ ๋์์ ์ํ ์ค์ด๊ฑฐ๋ ์ธ๋งํฌ์ด ์ฌ์ฉ ์์ ์ผ ์ ์์ผ๋ฏ๋ก ์ข ๋ฃ ์ ํ๋ ๊ฒ์ด ๋ฐ๋์ง), ์ด ํ๋๊ทธ๋ TASK_INTERRUPTIBLE๋งํผ ์์ฃผ ์ฌ์ฉ ์ ํจ.
- __TASK_TRACED - ๋๋ฒ๊ฑฐ ๋ฑ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ptrace๋ฅผ ํตํด ํด๋น ํ๋ก์ธ์ค๋ฅผ ์ถ์ ํ๋ ์ํ
- __TASK_STOPPED - ํ๋ก์ธ์ค ์คํ์ด ์ ์ง๋ ์ํ. ํด๋น ํ์คํฌ๋ ์คํ ์ค์ด์ง๋ ์๊ณ ์คํ ๊ฐ๋ฅํ ์ํ๋ ์๋. ์์ ์ด SIGSTOP, SGTSTP, SIGTTIN, SIGTTOU ๊ฐ์ ์๊ทธ๋์ ๋ฐ์ ๊ฒฝ์ฐ ๋๋ฒ๊ทธ ์ค์ ์๊ทธ๋์ ๋ฐ์ ๊ฒฝ์ฐ์ ์ด ์ํ๊ฐ ์ด ์ํ๊ฐ ๋จ.
ํ์ฌ ํ๋ก์ธ์ค ์ํ ์กฐ์
์ปค๋ ์ฝ๋์์ ํ๋ก์ธ์ค์ ์ํ๋ฅผ ๋ฐ๊ฟ ํ์๊ฐ ์๊ธฐ๋ ๊ฒฝ์ฐ ๋ง์.
๋ค์ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ๊ถ์ฅ
set_task_state(task, state); // ํ์คํฌ 'task'์ ์ํ๋ฅผ 'state' ์ํ๋ก ์ค์
์ด ํจ์๋ ํน์ ํ์คํฌ์ ์ํ๋ฅผ ์ง์ ํ ์ํ๋ก ๋ณ๊ฒฝ. ๊ทธ๋ฆฌ๊ณ ํ์ํ ๊ฒฝ์ฐ, ์ด ํจ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ ๊ธฐ๋ฅ ์ด์ฉ ๋ค๋ฅธ ํ๋ก์ธ์์ ์์ ์์ ๊ฒน์น๋ ๊ฒ ๋ฐฉ์ง(๋์นญํ ๋ค์ค ํ๋ก์ธ์ค ์์คํ ์์ ์ด ๊ธฐ๋ฅ ํ์).
๋์นญํ ๋ค์ค ํ๋ก์ธ์ค ์์คํ ๊ฒฝ์ฐ ๊ณ ๋ คํ ๊ฒ์ ๋นผ๋ฉด ์ด ํจ์๋ ๋ค์ ๋์์ ํจ
task->state = state;
set_current_state(state) ํจ์๋ set_task_state(current, state) ํจ์์ ๊ฐ์.
ํด๋น ํจ์ ๊ตฌํ์ <linux/sched.h> ์ฐธ๊ณ
ํ๋ก์ธ์ค ์ปจํ ์คํธ
ํ๋ก์ธ์ค์ ์ค์ํ ๋ถ๋ถ ์ค ํ๋๋ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ ์ฝ๋
์คํ ํ์ผ์์ ์ด ์ฝ๋๋ฅผ ์ฝ์ด ๋ค์ด๊ณ , ํ๋ก๊ทธ๋จ ์ฃผ์ ๊ณต๊ฐ์์ ์ฝ๋ ์คํํจ
์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ์คํ๋จ
ํ๋ก๊ทธ๋จ์ด ์์คํ
ํธ์ถ์ ์ฌ์ฉํ๊ฑฐ๋ ์์ธ ์ฒ๋ฆฌ ๋ฐ์ ์, ํ๋ก๊ทธ๋จ์ ์ปค๋ ๊ณต๊ฐ์ผ๋ก ์ง์
ํจ
์ด๋ฐ ์ํฉ์ ์ปค๋์ด 'ํ๋ก์ธ์ค๋ฅผ ๋์ ํด ์คํ ์ค' ๋๋ '์ปค๋์ด ํ๋ก์ธ์ค ์ปจํ
์คํธ์ ์์'์ด๋ผ๊ณ ํจ
ํ๋ก์ธ์ค ์ปจํ
์คํธ์ ์์ ๋ current ๋งคํฌ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
๊ทธ ์ฌ์ด์ ์ฐ์ ์์๊ฐ ๋์ ํ๋ก์ธ์ค๊ฐ ์คํ ๊ฐ๋ฅํ ์ํ๊ฐ ๋์ด ์ค์ผ์ค๋ฌ๊ฐ ๊ทธ ํ๋ก์ธ์ค ๋จผ์ ์คํํ์ง ์์ผ๋ฉด, ์ปค๋์ด ์์
๋๋ด๋ฉด ํ๋ก์ธ์ค๋ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ์คํ ๊ณ์ํจ
์์คํ
ํธ์ถ๊ณผ ์์ธ ์ฒ๋ฆฌ๊ธฐ๋ ์ ์ ์๋ ์ปค๋ ์ง์
์ธํฐํ์ด์ค์
ํ๋ก์ธ์ค๋ ์ด ๋ ๊ฐ์ง ์ธํฐํ์ด์ค ์ค ํ๋๋ฅผ ํตํด ์ปค๋ ๊ณต๊ฐ์ ๋ค์ด๊ฐ ์ ์์
์ฆ, ์ปค๋์ ๋ํ ์ ๊ทผ์ ์ด ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด์ผ๋ง ํจ
ํ๋ก์ธ์ค ๊ณ์ธต ํธ๋ฆฌ
์ ๋์ค ์์คํ
์ฒ๋ผ ๋ฆฌ๋
์ค๋ ํ๋ก์ธ์ค ๊ฐ ๋
ํนํ ๊ณ์ธต ๊ตฌ์กฐ ์กด์ฌ
๋ชจ๋ ํ๋ก์ธ์ค๋ PID๊ฐ 1์ธ init ํ๋ก์ธ์ค์ ์์์
init ํ๋ก์ธ์ค๋ ๋ถํธ ๊ณผ์ ์ ์ต์ข
๋จ๊ณ์์ ์ปค๋์ด ์คํํ๋ ํ๋ก์ธ์ค์
๊ทธ ๋ค์ init ํ๋ก์ธ์ค๋ ์์คํ
์ ์ด๊ธฐํ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ด ๋ ๋ง์ ํ๋ก๊ทธ๋จ ์คํ์์ผ ๋ถํธ ๊ณผ์ ์๋ฃํจ
์์คํ
์ ๋ชจ๋ ํ๋ก์ธ์ค๋ ์ ํํ ํ๋์ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง
๋ํ ๋ชจ๋ ํ๋ก์ธ์ค๋ ํ๋ ์ด์์ ์์ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง ์ ์์
๊ฐ์ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง๋ ์์ ํ๋ก์ธ์ค๋ฅผ ํ์ ํ๋ก์ธ์คsibling๋ผ๊ณ ๋ถ๋ฆ
ํ๋ก์ธ์ค๊ฐ์ ๊ด๊ณ๋ ํ๋ก์ธ์ค ์์ ์์ ์ ์ฅ๋จ
๊ฐ task_struct ๊ตฌ์กฐ์ฒด์๋ ๋ถ๋ชจ์ task_struct๋ฅผ ๊ฐ๋ฆฌํค๋ parent๋ผ๋ ํฌ์ธํฐ์ ์์์ task_struct ๋ฆฌ์คํธ๋ฅผ ๊ฐ๋ฆฌํค๋ children ํฌ์ธํฐ๊ฐ ๋ค์ด ์์
ํ์ฌ ํ๋ก์ธ์ค์ ๋ํด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ด์ฉ ์ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ํ๋ก์ธ์ค ์์ ์ ์ป๊ธฐ ๊ฐ๋ฅ
struct task_struct *my_parent = current->parent;
๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ก ํ๋ก์ธ์ค์ ๋ชจ๋ ์์ ํ๋ก์ธ์ค์ ์ ๊ทผ ๊ฐ๋ฅ
struct task_struct *task;
struct list_head *list;
list_for_each(list, ¤t->children) {
task = list_entry(list, struct task_struct, sibling);
// ์ด์ task๋ ํ์ฌ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค ์ค ํ๋๋ฅผ ๊ฐ๋ฆฌํด
}
init ํ์คํฌ์ ํ๋ก์ธ์ค ์์ ์๋ init_task๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ ์ผ๋ก ํ ๋น๋จ
๋ค์ ์ฝ๋๋ ๋ชจ๋ ํ๋ก์ธ์ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค
struct task_struct *task;
for (task = current; task != &init_task; task = task->parent)
;
// task๊ฐ init์ ๊ฐ๋ฆฌํฌ ๋๊น์ง ๋ฐ๋ณต
ํ๋ก์ธ์ค ๊ณ์ธต ๊ตฌ์กฐ ์ด์ฉ ์ ์์คํ
์ ์ด๋ค ํ๋ก์ธ์ค์์๋ ๋ค๋ฅธ ํน์ ํ๋ก์ธ์ค ์ฐพ์๊ฐ ์ ์์
์์คํ
์ ๋ชจ๋ ํ๋ก์ธ์ค๋ฅผ ํ๊ณ ์ถ์ ๋์๋ ์์
(ํ์คํฌ) ๋ฆฌ์คํธ๊ฐ ํํ ์๋ฐฉํฅ ๋ฆฌ์คํธ์ด๋ฏ๋ก ๋งค์ฐ ์ฝ๊ฒ ์์
๊ฐ๋ฅ
์ด๋ค ํ์คํฌ๊ฐ ์ฃผ์ด์ก์ ๋ ๋ฆฌ์คํธ์์ ๋ค์ ํ์คํฌ๋ฅผ ์ป๊ธฐ ์ํด์๋ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋จ
list_entry(task->tasks.next, struct task_struct, tasks)
์ด์ ํ์คํฌ๋ฅผ ์ป๊ธฐ ์ํด์๋ ๋ค์ ์ฝ๋ ์คํ
list_entry(task->tasks.prev, struct task_struct, tasks)
์ ๋ ๊ฐ์ง ๋ฃจํด์ next_task(task)์ prev_task(task)๋ผ๋ ๋งคํฌ๋ก๋ก ์ ๊ณต๋จ
์ ์ฒด ํ์คํฌ ์ด๊ฑฐํ๋ for_each_process(task) ๋งคํฌ๋ก(๋ฐ๋ณต ๋จ๊ณ๋ง๋ค task ํฌ์ธํฐ๋ ๋ฆฌ์คํธ์ ๋ค์ ํ์คํฌ ๊ฐ๋ฆฌํด)
struct task_struct *task;
for_each_process(task) {
// ๋งคํฌ๋ก์ ๊ฐ ๋ฐ๋ณต๋ง๋ค ๊ฐ ํ์คํฌ์ ์ด๋ฆ๊ณผ PID ์ถ๋ ฅ๋จ
printk("%s[%d]\n", task->comm, task->pid);
}
๋ชจ๋ ํ์คํฌ ์ด๊ฑฐํ๋ ์ผ์ ๋งค์ฐ ๋ถํ๊ฐ ํฐ ์์ ์
ํ๋ก์ธ์ค ์์ฑ
๋๋ถ๋ถ OS๋ ์คํฐspawn ๋ฐฉ์์ผ๋ก ์๋ก์ด ์ฃผ์ ๊ณต๊ฐ์ ์ ํ๋ก์ธ์ค ๋ง๋ค๊ณ , ์คํ ํ์ผ ์ฝ์ ํ ๊ทธ ์ฝ๋๋ฅผ ์คํํ์ฌ ํ๋ก์ธ์ค ์์ฑ
์ ๋์ค๋ ๋ ํนํ๊ฒ ์ด ๊ณผ์ ์ fork()์ exec()์ด๋ผ๋ ๋ ํจ์๋ก ๋ถ๋ฆฌ
- ์ฌ๊ธฐ์ exec() ํจ์๋ exec() ํจ์ ๊ตฐ์ ์ผ์ปฌ์. ์ปค๋์ execve() ์์คํ ํธ์ถ์ ๋ฐํ์ผ๋ก execlp(), execle(), execv(), execvp() ํจ์๋ฅผ ๊ตฌํํจ.
๋จผ์ fork()๋ ํ์ฌ ํ์คํฌ๋ฅผ ๋ณต์ ํด ์์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ฆ
์ด๋ ๊ฒ ๋ง๋ค์ด์ง ํ๋ก์ธ์ค๋ (๊ณ ์ ๊ฐ์ ๊ฐ๋)PID์ (๋ถ๋ชจ ํ๋ก์ธ์ค PID์ธ)PPID, ์์๋์ง ์๋ ์ง์ฐ๋ ์๊ทธ๋๊ณผ ๊ฐ์ ์ผ๋ถ ์์๊ณผ ํต๊ณ ์์น ์ ์ธํ๊ณ ๋ ๋ถ๋ชจ์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง
๋ค์ ํจ์์ธ exec()์ ์๋ก์ด ์คํํ์ผ์ ์ฃผ์ ๊ณต๊ฐ์ ๋ถ๋ฌ์ค๊ณ ์ด๋ฅผ ์คํ
fork() ๋ค์์ exec()์ ์คํํ๋ ์กฐํฉ์ ๋๋ถ๋ถ OS์์๋ ํ๋์ ํจ์๋ก ์ ๊ณต
Copy-on-Write
์ ํต์ ์ธ fork()๋ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ๋ชจ๋ ์์ ๋ณต์ฌํด ์์ ํ๋ก์ธ์ค์๊ฒ ๋๊ฒจ์ค
์ด๋ฐ ๋ฐฉ์์ ๊ณต๊ท ๊ฐ๋ฅํ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ฏ๋ก ๋จ์ํ๊ณ ๋นํจ์จ์
๊ฒ๋ค๊ฐ ์๋ก ๋ง๋ ํ๋ก์ธ์ค๊ฐ ๋ฐ๋ก ๋ค๋ฅธ ํ๋ก๊ทธ๋จ ์คํํ๋ ๊ฒฝ์ฐ ๋ณต์ฌ ์์
์ด ๋ชจ๋ ํ์๊ณ ๊ฐ ๋จ
๋ฆฌ๋
์ค์์๋ 'copy-on-write(๊ธฐ๋ก์ฌํญ ๋ฐ์ ์ ๋ณต์ฌ)' ํ์ด์ง๋ฅผ ์ด์ฉํด fork() ํจ์ ๊ตฌํํ์
๊ธฐ๋ก์ฌํญ ๋ฐ์ ์ ๋ณต์ฌCOW, Copy-on-Write ๊ธฐ๋ฅ์ ๋ฐ์ดํฐ ๋ณต์ฌ๋ฅผ ์ง์ฐ ๋๋ ๋ฐฉ์งํ๋ ๊ธฐ๋ฅ์
ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ์ ๋ณต์ฌํ๋ ๋์ ๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ๊ณต๊ฐ ๊ณต์ ํจ
๊ทธ๋ฌ๋ ๊ธฐ๋ก์ฌํญ ๋ฐ์ํด ๋ฐ์ดํฐ ๋ณ๊ฒฝ ํ์ ์ ๊ทธ ์๊ฐ ์ฌ๋ณธ์ ๋ง๋ค์ด ๊ฐ ํ๋ก์ธ์ค๊ฐ ๋ณ๋์ ๋ด์ฉ ๊ฐ์ง๊ฒ ๋จ
๋ฐ๋ผ์ ๋ฆฌ์์ค ๋ณต์ฌ๋ ํด๋น ๋ฆฌ์์ค์ ๋ํ ๊ธฐ๋ก์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋ง ์ผ์ด๋จ
๊ทธ๋๊น์ง๋ ์ฝ๊ธฐ์ ์ฉ ์ํ๋ก ๊ณต์ ๊ฐ๋ฅ
์ด ๊ธฐ๋ฒ์ ์ฃผ์ ๊ณต๊ฐ์ ์ค์ ๊ธฐ๋ก ์์
์ผ์ด๋ ๋๊น์ง ๊ฐ ํ์ด์ง์ ๋ณต์ฌ ์์
์ ์ง์ฐ์ํด
ํ๋ก์ธ์ค๊ฐ ์ ๋ ๊ธฐ๋ก์ ํ์ง ์๋ ๊ฒฝ์ฐ, e.g. fork() ์งํ์ exec() ํจ์๊ฐ ํธ์ถ๋๋ ๊ฒฝ์ฐ์๋ ๋ณต์ฌ๊ฐ ํ์ ์์ด์ง
fork() ํจ์๊ฐ ํด์ผ ํ ์ผ์ ํ๋ก์ธ์ค์ ํ์ด์ง ํ
์ด๋ธ์ ๋ณต์ฌํ๋ ๊ฒ, ์์ ํ๋ก์ธ์ค์ฉ ํ๋ก์ธ์ค ์์ ์๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ๋ฟ์
์ผ๋ฐ์ ์ผ๋ก ํ๋ก์ธ์ค๋ ์์ฑ๋ ๋ค์ ๋ค๋ฅธ ์คํํ์ผ ์คํํ๋ฏ๋ก, ์ด ๊ฐ์ ์ต์ ํ๋ฅผ ํตํด ๋ง์ ๋ฐ์ดํฐ ๋ณต์ฌ ๋ญ๋น๋ฅผ ๋ง์
์ ๋์ค์ ์ฒ ํ์ธ ๋น ๋ฅธ ํ๋ก์ธ์ค ์คํ์ ๋ถํฉ
ํ๋ก์ธ์ค ์์ฑ
๋ฆฌ๋
์ค๋ clone() ์์คํ
ํธ์ถ ์ด์ฉ fork() ๊ตฌํ
clone() ์์คํ
ํธ์ถ์ ๋ค์ํ ํ๋๊ทธ ์ฌ์ฉํด ๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ๊ฐ ํ์ํ ์์ ์ง์
fork(), vfork(), __clone() ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ ๊ฐ์ ์ ์ ํ ํ๋๊ทธ ์ฌ์ฉํด clone()์ ํธ์ถํจ
clone() ์์คํ
ํธ์ถ์ ๋ค์ do_fork() ํจ์๋ฅผ ํธ์ถ
์ค์ ํ๋ก์ธ์ค ์์ฑ ์์
์ kernel/fork.c์ ์ ์๋ do_fork() ํจ์์์ ์ฒ๋ฆฌํจ
์ด ํจ์๋ copy_process() ํจ์ ํธ์ถํ๊ณ ํ๋ก์ธ์ค ์คํ์ ์์ํจ
copy_process() ํจ์๊ฐ ํ๋ ์ผ์ ๋ค์๊ณผ ๊ฐ์
- dup_task_struct() ํจ์๋ฅผ ํธ์ถํด ์ปค๋ ์คํ ์๋ก ๋ง๋ค๊ณ , ์ ํ๋ก์ธ์ค์ฉ thread_info, task_struct ๊ตฌ์กฐ์ฒด ๋ง๋ฆ. ์๋ก ๋ง๋ค์ด์ง ๋ฐ์ดํฐ์ ๊ฐ์ ํ์ฌ ํ์คํฌ์ ๋์ผํจ. ์ด ์์ ์ ๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค์ ํ๋ก์ธ์ค ์์ ์๋ ๊ฐ์.
- ์๋ก ๋ง๋ ์์ ํ๋ก์ธ์ค๋ก ์ธํด ํ์ฌ ์ฌ์ฉ์์ ํ๋ก์ธ์ค ๊ฐ์ ์ ํ์ ๋์ด๊ฐ์ง ์๋์ง ํ์ธ.
- ์ด์ ์์ ํ๋ก์ธ์ค๋ฅผ ๋ถ๋ชจ์ ๊ตฌ๋ณํด์ผ ํจ. ํ๋ก์ธ์ค ์์ ์์ ๋ค์ํ ํญ๋ชฉ์ ๊ฐ์ ์ด๊ธฐํํจ. ํ๋ก์ธ์ค ์์ ์์์ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ๊ฐ์ ๋ฌผ๋ ค๋ฐ์ง ์๋ ํญ๋ชฉ์ ์ฃผ๋ก ํต๊ณ ์ ๋ณด. ๋๋ถ๋ถ์ task_struct ํญ๋ชฉ ๊ฐ์ ๋ฐ๋์ง ์์.
- ์์ ํ๋ก์ธ์ค์ ์ํ๋ฅผ TASK_UNINTERRUPTIBLE๋ก ์ค์ ํด ์์ง ์คํ๋์ง ์๊ฒ ํจ.
- copy_process()๋ copy_flag() ํจ์๋ฅผ ํธ์ถํด task_struct ๊ตฌ์กฐ์ฒด์ flags ๋ด์ฉ์ ์ ๋ฆฌํจ. ์์ ์ด ๊ด๋ฆฌ์ ๊ถํ์ ๊ฐ์ง๊ณ ์์์ ๋ปํ๋ PF_SUPERPRIV ํ๋๊ทธ๋ฅผ ์ด๊ธฐํํจ. ํ๋ก์ธ์ค๊ฐ exec() ํจ์๋ฅผ ํธ์ถํ์ง ์์์์ ๋ปํ๋ PF_FORKNOEXEC ํ๋๊ทธ๋ฅผ ์ค์ ํจ.
- alloc_pid() ํจ์๋ฅผ ํธ์ถํด ์๋ก ๋ง๋ ํ์คํฌ์ ์๋ก์ด PID ๊ฐ์ ํ ๋นํจ.
- clone() ํจ์์ ์ ๋ฌ๋ ํ๋๊ทธ ๊ฐ์ ๋ฐ๋ผ copy_process()๋ ์ด๋ฆฐ ํ์ผ ๋ฐ ํ์ผ์์คํ ์ ๋ณด, ์๊ทธ๋ ํธ๋ค๋ฌ, ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ, ๋ค์์คํ์ด์คnamespace ๋ฑ์ ๋ณต์ ํ๊ฑฐ๋ ๊ณต์ ํจ. ๋ณดํต ์ค๋ ๋ ์ฌ์ด์์๋ ์ด๋ฐ ์์์ ๊ณต์ ํ๋ฉฐ, ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ๊ฐ๋ณ์ ์ผ๋ก ์ฌ์ฉํ๋ฏ๋ก ์ด ๋จ๊ณ์์ ๋ณต์ ํจ.
- ๋ง์ง๋ง์ผ๋ก copy_process()๋ ๋๋จธ์ง ์ ๋ฆฌ ์์ ์ ์ํํ๊ณ ํธ์ถํ ์ชฝ์ ์๋ก ๋ง๋ ์์ ํ๋ก์ธ์ค์ ํฌ์ธํฐ๋ฅผ ๋ฐํํจ.
do_fork()๋ก ๋ฐํ๋์ด ๋์์ค๋ฉด copy_process()๊ฐ ์ฑ๊ณตํ ๊ฒฝ์ฐ์ ์๋ก ๋ง๋ ์์ ํ๋ก์ธ์ค๋ฅผ ๊นจ์์ ์คํํจ
์ปค๋์ ์๋์ ์ผ๋ก ์์ ํ๋ก์ธ์ค๋ฅผ ๋จผ์ ์คํํจ(์ ๋๋ก ๋์ ์ ๋๋ ๊ฒฝ์ฐ ์์)
์ผ๋ฐ์ ์ผ๋ก ์์ ํ๋ก์ธ์ค๋ ๋ฐ๋ก exec() ํจ์ ํธ์ถํ๋ฏ๋ก, ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ๋จผ์ ์คํ๋ ์ ์ฃผ์ ๊ณต๊ฐ์ ์ฐ๊ธฐ ์์
์ด ์๊ฒจ ๋ฐ์ํ๋ COW ์์
๋ง์ ์ ์์
vfork()
vfork() ์์คํ
ํธ์ถ์ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ํ์ด์ง ํ
์ด๋ธ์ ๋ณต์ฌํ์ง ์๋๋ค๋ ์ ๋ง ๋นผ๋ฉด fork()์ ๋๊ฐ์ด ๋์ํจ
๋์ ์์ ํ๋ก์ธ์ค๋ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ ์์์ ๋ณ๊ฐ์ ์ค๋ ๋ ํํ๋ก ์คํ๋๊ณ , ๋ถ๋ชจ ํ๋ก์ธ์ค๋ ์์ ํ๋ก์ธ์ค๊ฐ exec()์ ํธ์ถํ๊ฑฐ๋ ์ข
๋ฃํ ๋๊น์ง ๋๊ธฐํจ
์์ ํ๋ก์ธ์ค๋ ์ฃผ์ ๊ณต๊ฐ์ ๋ด์ฉ์ ๋ฐ๊ฟ ์ ์์
COW๋ฅผ ์ด์ฉํด fork()๋ฅผ ๊ตฌํํ ์ ์์๋ ์๋ 3BSD ์์ ์๋นํ ์ข์ ์ต์ ํ ๊ธฐ๋ฒ์ด์์
2.6 ๋ฒ์ ๊ธฐ์ค COW, ์์ ํ๋ก์ธ์ค ์ฐ์ ์คํ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, vfork() ์ฌ์ฉ์ผ๋ก ์ป์ ์ ์๋ ์ด์ ์ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ํ์ด์ง ํ
์ด๋ธ ๋ณต์ฌ ์ ํ๋ ๊ฒ๋ฟ์
๋ฆฌ๋
์ค ํ์ด์ง ํ
์ด๋ธ ํญ๋ชฉ์ ๋ํด์๋ COW ๊ธฐ๋ฅ ์ ๊ณต ์ ์ด ์ฅ์ ๋ ์ฌ๋ผ์ง
vfork()์ ์๋ ๋ฐฉ์ ์๋นํ ๊น๋ค๋ก์(e.g. exec() ์คํจ ์ ๋์ฒ ๋ฐฉ๋ฒ?)
์ด์์ ์ธ ์์คํ
์ด๋ผ๋ฉด vfork() ํ์ ์์์ผ๋ก ์ปค๋์์ ๊ผญ ์ด๋ฅผ ๊ตฌํ ์ ํด๋ ๋จ
์ผ๋ฐ์ ์ธ fork() ์ด์ฉํด vfork() ๊ตฌํํด๋ ๋ฌธ์ ์์, ์ค์ ๋ก 2.2 ๋ฒ์ ์ปค๋๊น์ง ์ด ๋ฐฉ์ ์ฌ์ฉ
vfork() ์์คํ ํธ์ถ์ clone() ์์คํ ํธ์ถ์ ํน๋ณํ ํ๋๊ทธ๋ฅผ ์ง์ ํด ๊ตฌํํจ
- copy_process()์์ task_struct์ vfork_done ํญ๋ชฉ์ NULL๋ก ์ค์ ํจ.
- ํน๋ณํ ํ๋๊ทธ๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ do_fork()์์ vfork_done ํฌ์ธํฐ๊ฐ ํน์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํจ.
- ๋ถ๋ชจ ํ๋ก์ธ์ค๋ ์์ ํ๋ก์ธ์ค๋ฅผ ์ฐ์ ์คํ์ํจ ๋ค์ ๋ฐํํ์ง ์๊ณ ์์ ํ๋ก์ธ์ค๊ฐ vfork_done ํฌ์ธํฐ ์ด์ฉํด ์ ํธ๋ฅผ ๋ณด๋ผ ๋๊น์ง ๋๊ธฐ.
- ํ์คํฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ์ ๋ฐํํ ๋ ํธ์ถ๋๋ mm_release() ํจ์์์ vfork_done ํฌ์ธํฐ๊ฐ NULL์ธ์ง ์๋์ง ํ์ธํจ. NULL์ด ์๋๋ฉด ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์ ํธ ๋ณด๋.
- do_fork() ํจ์๋ก ๋์๊ฐ์ ๋ถ๋ชจ ํ๋ก์ธ์ค ๊นจ์ฐ๊ณ ๋ฐํํจ.
๊ณํ๋๋ก ์งํ ์ ์์ ํ๋ก์ธ์ค๋ ์ ์ฃผ์ ๊ณต๊ฐ์์ ์คํ๋๊ณ , ๋ถ๋ชจ ํ๋ก์ธ์ค๋ ์๋ ์ฃผ์ ๊ณต๊ฐ์์ ์คํ๋จ
๋ถ๋ด์ ์ ์ง๋ง ๊น๋ํ ๊ตฌํ์ ์๋
๋ฆฌ๋ ์ค์ ์ค๋ ๋ ๊ตฌํ
์ค๋ ๋๋ ๋๋ฆฌ ์ฐ์ด๋ ํ๋์ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
์ค๋ ๋๋ฅผ ์ด์ฉํด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ๋ ๊ฐ์ ํ๋ก๊ทธ๋จ ์ฌ๋ฌ ๊ฐ ๋์์ ์คํ ๊ฐ๋ฅ
์ค๋ ๋๋ ์ฌ์ฉ ์ค์ธ ํ์ผ ๋ฐ ๊ธฐํ ์์์ ๊ณต์ ํจ
์ค๋ ๋๋ฅผ ํตํด ๋์ ํ๋ก๊ทธ๋๋ฐconcurrent programming์ด ๊ฐ๋ฅํด์ง๊ณ , ๋ค์ค ํ๋ก์ธ์ ์์คํ
์์๋ ์ง์ ํ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ๊ตฌํ ๊ฐ๋ฅํจ
๋ฆฌ๋
์ค๋ ๋
ํนํ ์ค๋ ๋ ๊ตฌํ ๋ฐฉ์ ๊ฐ์ง
๋ฆฌ๋
์ค ์ปค๋์๋ ๋ณ๋์ ์ค๋ ๋ ๊ฐ๋
์์
๊ธฐ๋ณธ์ ์ธ ํ๋ก์ธ์ค๋ก ๋ชจ๋ ์ค๋ ๋๋ฅผ ๊ตฌํ
๋ฆฌ๋
์ค ์ปค๋์ ์ค๋ ๋๋ฅผ ์ํ ๋ณ๋์ ์๋ฃ๊ตฌ์กฐ, ํน๋ณํ ์ค์ผ์ค๋ง ๊ธฐ๋ฒ ์์
๋ฆฌ๋
์ค์ ์ค๋ ๋๋ ํน์ ์์์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๊ณต์ ํ๋ ํน๋ณํ ํ๋ก์ธ์ค์ผ ๋ฟ
๊ฐ ์ค๋ ๋๋ ๋ณ๋์ task_struct ๊ตฌ์กฐ์ฒด ๊ฐ์ง, ์ปค๋ ์
์ฅ์์ ์ฃผ์ ๊ณต๊ฐ๊ณผ ๊ฐ์ ์์์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๊ณต์ ํ๊ณ ์๋ ์ ์์ ์ธ ํ๋ก์ธ์ค
์ค๋ ๋์ ๋ํ ์ด๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์๋์ฐ๋ ์๋ผ๋ฆฌ์ค์ฒ๋ผ ์ปค๋์์ ๋ณ๋์ ์ค๋ ๋(lightweigh process=๊ฒฝ๋ ํ๋ก์ธ์ค๋ผ ๋ถ๋ฅด๊ธฐ๋ ํจ)๋ฅผ ์ง์ํ๋ ๋ฐฉ์๊ณผ ํฌ๊ฒ ๋ค๋ฆ
๊ฒฝ๋ ํ๋ก์ธ์ค๋ผ๋ ์ด๋ฆ์ด ์์คํ
๊ฐ ์ฒ ํ์ ์ฐจ์ด ๋ณด์ฌ์ค
๋ฆฌ๋
์ค ์ธ ๋ค๋ฅธ OS์์ ์ค๋ ๋๋ ๋ฌด๊ฑฐ์ด ํ๋ก์ธ์ค์ ๋นํด ๊ฐ๋ณ๊ณ ๋น ๋ฅต ์คํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฌด์ธ๊ฐ
๋ฆฌ๋
์ค์์๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์์์ ๊ณต์ ํ๋(์ด๋ฏธ ์ถฉ๋ถํ ๊ฒฝ๋ํ๋) ํ๋ก์ธ์ค์ ๋ถ๊ณผํจ
e.g. ๋ค ๊ฐ์ ์ค๋ ๋๋ก ๊ตฌ์ฑ๋ ํ๋ก์ธ์ค ๊ฒฝ์ฐ
๋ฆฌ๋
์ค : ๋ค ๊ฐ์ ํ๋ก์ธ์ค์ ๊ฐ๊ฐ ๋ค ๊ฐ์ ํ๋ก์ธ์ค ์์ ์, ํ๋ก์ธ์ค๊ฐ ์ผ๋ถ ์์ ๊ณต์
๋ค๋ฅธ OS : ํ๋์ ํ๋ก์ธ์ค ์์ ์ ์์ ๋ค ๊ฐ์ ์ค๋ ๋ ๊ฐ๋ฆฌํค๋ ์ ๋ณด, ์ฃผ์ ๊ณต๊ฐ์ด๋ ์ฌ์ฉ ์ค์ธ ํ์ผ ๋ฑ ๊ณต์ ์์ ์ ๋ณด๋ ์์ ์ ๋ด์ ์กด์ฌ
=> ๋ฆฌ๋
์ค๊ฐ ๋งค์ฐ ๋ช
์พํ ๊ตฌ์กฐ
์ค๋ ๋ ์์ฑ
์ค๋ ๋๋ ์ ์์ ์ธ ํ์คํฌ์ ๋ง์ฐฌ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด์ง
๋ค๋ง, clone() ์์คํ
ํธ์ถ ์ ํน์ ์์ ๊ณต์ ํ๋๋ก ํ๋๊ทธ ์ง์ ํด์ค
clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);
์์ ์ฝ๋๋ ์ฃผ์ ๊ณต๊ฐ, ํ์ผ์์คํ
์์, ํ์ผ ์์ ์, ์๊ทธ๋ ํธ๋ค๋ฌ ๊ณต์ ํ๋ค๋ ์ ์ ์ธํ๋ฉด ์ ์์ fork() ์์คํ
ํธ์ถ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์
์ฆ, ์ ํ์คํฌ์ ๊ทธ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ ํํ ๋งํ๋ ์ค๋ ๋ ๊ด๊ณ๊ฐ ๋จ
๋ฐ๋ฉด, ์ผ๋ฐ์ ์ธ fork()๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋จ
clone(SIGHAND,0);
vfork()๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋จ
clone(CLONE_VFORK | CLONE_VM | SIGCHLD, 0);
clone()์ ๋๊ฒจ์ฃผ๋ ํ๋๊ทธ๋ฅผ ํตํด ์๋ก์ด ํ๋ก์ธ์ค์ ๋์์ ์ ์
๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค๊ฐ์ ๊ณต์ ํ ์์์ ์์ธํ ์ง์ดํจ
clone์์ ์ฌ์ฉํ๋ ํ๋๊ทธ๋ <linux/sched.h>์ ์ ์๋์ด ์์
clone()์ ์์คํ ํธ์ถ ํ๋๊ทธ
ํ๋๊ทธ | ์๋ฏธ |
---|---|
CLONE_FILES | ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉ ์ค์ธ ํ์ผ ๊ณต์ |
CLONE_FS | ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค๊ฐ ํ์ผ์์คํ ์ ๋ณด๋ฅผ ๊ณต์ |
CLONE_IDLETASK | PID๋ฅผ 0์ผ๋ก ์ค์ (์ ํด ์ํ์ ํ์คํฌ์์๋ง ์ฌ์ฉ) |
CLONE_NEWNS | ์์ ํ๋ก์ธ์ค๋ฅผ ์ํ ์ ๋ค์์คํ์ด์ค ์์ฑ |
CLONE_PARENT | ์์ ํ๋ก์ธ์ค๊ฐ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ๋์ผํ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง๋๋ก ์ค์ |
CLONE_PTRACE | ์์ ํ๋ก์ธ์ค์ ๋ํด์๋ ์ถ์ ๊ธฐ๋ฅ์ ํ์ฑํ |
CLONE_SETTID | TID(Thread ID)๋ฅผ ์ฌ์ฉ์ ๊ณต๊ฐ์๋ ๊ธฐ๋ก |
CLONE_SETTLS | ์์ ํ๋ก์ธ์ค๋ฅผ ์ํ ์ TLS(์ค๋ ๋๋ณ ์ ์ฅ๊ณต๊ฐ thread-local storage)๋ฅผ ์์ฑ |
CLONE_SIGHAND | ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค๊ฐ ์๊ทธ๋ ํธ๋ค๋ฌ ๋ฐ ์๊ทธ๋ ์ฐจ๋จ ์ฌํญ์ ๊ณต์ |
CLONE_SYSVSEM | ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค๊ฐ ์์คํ V SEM_UNDO ๋ฐฉ์์ ๊ณต์ |
CLONE_THREAD | ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ์ค๋ ๋๊ตฐ์ ์ํ๊ฒ ์ค์ |
CLONE_VFORK | vfork() ๋ฐฉ์์ ์ฌ์ฉํด ์์ ํ๋ก์ธ์ค๊ฐ ๊นจ์ธ ๋๊น์ง ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ์ค์ง |
CLONE_UNTRACED | ์ถ์ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค์ CLONE_PTRACE๋ฅผ ์ง์ ํ์ง ๋ชปํ๊ฒ ํจ |
CLONE_STOP | ํ๋ก์ธ์ค๋ฅผ TASK_STOPPED ์ํ์์ ์์ |
CLONE_CHILD_CLEARTID | ์์ ํ๋ก์ธ์ค์ TID๋ฅผ ์ด๊ธฐํ |
CLONE_CHILD_SETTID | ์์ ํ๋ก์ธ์ค์ TID๋ฅผ ์ค์ |
CLONE_PARENT_SETTID | ๋ถ๋ชจ ํ๋ก์ธ์ค์ TID๋ฅผ ์ค์ |
CLONE_VM | ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค๊ฐ ์ฃผ์ ๊ณต๊ฐ ๊ณต์ |
์ปค๋ ์ค๋ ๋
์ปค๋๋ ์ผ๋ถ ๋์์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ๋ ๊ฒ์ด ์ข์ ๋๊ฐ ์์
์ปค๋ ๊ณต๊ฐ์์๋ง ์กด์ฌํ๋ ํ์ค ํ๋ก์ธ์ค์ธ ์ปค๋ ์ค๋ ๋ ์ด์ฉํด ์ด๋ฐ ์์
๊ฐ๋ฅ
์ปค๋ ์ค๋ ๋์ ์ ์ ํ๋ก์ธ์ค๊ฐ ์ฃผ์ ์ฐจ์ด์ ์ ์ปค๋ ์ค๋ ๋์๋ ์ฃผ์ ๊ณต๊ฐ์ด ์๋ค๋ ์ (ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ ๊ฐ๋ฆฌํค๋ mm ํฌ์ธํฐ๊ฐ NULL์)
์ปค๋ ์ค๋ ๋๋ ์ปค๋ ๊ณต๊ฐ์์๋ง ๋์ํ๋ฉฐ ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ์ปจํ
์คํธ ์ ํ ์ ์ผ์ด๋จ
ํ์ง๋ง ์ ์ ํ๋ก์ธ์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ปค๋ ์ค๋ ๋๋ ์ค์ผ์ค๋ง๋๋ฉฐ ์ ์ ๊ฐ๋ฅ
๋ฆฌ๋
์ค๋ ์ผ๋ถ ์์
์ ์ปค๋ ์ค๋ ๋๋ฅผ ํตํด ์ฒ๋ฆฌํจ
๋ํ์ ์ผ๋ก flush ๋ฐ ksoftirqd ์์
์ด ์์
ps -ef
๋ช
๋ น ์ด์ฉํ๋ฉด ๋ฆฌ๋
์ค ์์คํ
์ ์ปค๋ ์ค๋ ๋ ํ์ธ ๊ฐ๋ฅ
์ปค๋ ์ค๋ ๋๋ ๋งค์ฐ ๋ง์
์ปค๋ ์ค๋ ๋๋ ์์คํ
๋ถํ
์ ๋ค๋ฅธ ์ปค๋ ์ค๋ ๋์ ์ํด ๋ง๋ค์ด์ง
์ปค๋ ์ค๋ ๋๋ ๋ค๋ฅธ ์ปค๋ ์ค๋ ๋๋ฅผ ํตํด์๋ง ๋ง๋ค ์ ์์
๋ฆฌ๋
์ค๋ kthreadd ์ปค๋ ํ๋ก์ธ์ค๊ฐ ๋ชจ๋ ์ปค๋ ์ค๋ ๋๋ฅผ ๋ง๋๋ ๋ฐฉ์์ผ๋ก ์ปค๋ ์ค๋ ๋ ๊ด๋ฆฌํจ
์ ์ปค๋ ์ค๋ ๋ ๋ง๋ค๋ ค๋ฉด <linux/kthread.h>์ ์ ์๋ ๋ค์ ์ธํฐํ์ด์ค ์ฌ์ฉ
struct task_struct *kthread_create(int (*threadfn) (void *data), void *data, const char namefmt[], ...)
kthread ์ปค๋ ํ๋ก์ธ์ค๋ clone() ์์คํ
ํธ์ถ์ ์ด์ฉํด ์ ํ์คํฌ๋ฅผ ๋ง๋ฆ
์๋ก ๋ง๋ค์ด์ง ํ๋ก์ธ์ค๋ data ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ ๋ฌ๋ threadfn ํจ์๋ฅผ ์คํํจ
์ ํ๋ก์ธ์ค๋ printf ์คํ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ๋งค๊ฐ ๋ณ์๋ก ํ์ํํ namefmt ๋ฌธ์์ด์ ํด๋นํ๋ ์ด๋ฆ ๊ฐ์ง
์ฒ์ ํ๋ก์ธ์ค๋ ์คํํ ์ ์๋ ์ํ๋ก ๋ง๋ค์ด์ง
wake_up_process() ํจ์๋ฅผ ํตํด ๋ช
์์ ์ผ๋ก ๊นจ์์ฃผ์ง ์์ผ๋ฉด ์คํ๋์ง ์์
kthread_run() ํจ์๋ฅผ ์ด์ฉํ๋ฉด ์คํ ๊ฐ๋ฅํ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ก ๋ง๋ค ์ ์์
struct task_struct *kthread_run(int (*threadfn) (void *data), void *data, const char namefmt[], ...)
์ด ํจ์๋ ๋งคํฌ๋ก๋ก ๊ตฌํ๋์๊ณ , kthread_create()์ wake_up_process()๋ฅผ ํธ์ถํ๋ ๋จ์ํ ํจ์
#define kthread_run(threadfn, data, namefmt, ...)
({
struct task_struct *k;
k = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__);
if (!IS_ERR(k))
wake_up_process(k);
k;
})
์ปค๋ ์ค๋ ๋๋ ํ๋ฒ ์์๋๋ฉด ์ค์ค๋ก do_exit() ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋, ์ปค๋์ ๋ค๋ฅธ ๋ถ๋ถ์์ kthread_create()๊ฐ ๋ฐํํ task_struct ๊ตฌ์กฐ์ฒด์ ์ฃผ์์ ํจ๊ป kthread_stop() ํจ์๋ฅผ ํธ์ถํ ๋๊น์ง ๊ณ์ ์คํ๋จ
int kthread_stop(struct task_struct *k)
ํ๋ก์ธ์ค ์ข ๋ฃ
ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ฉด ์ปค๋์ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ์์ ๋ฐ๋ฉ ํ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค์ ์ข ๋ฃ๋ฅผ ์๋ ค์ค
์ผ๋ฐ์ ์ผ๋ก ํ๋ก์ธ์ค ์ข
๋ฃ๋ ์๋ฐ์ ๋ฐ์
ํ๋ก์ธ์ค๊ฐ ์ค๋น๋ฌ์ ๋ ๋ช
์์ ์ผ๋ก exit() ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋, ํ๋ก๊ทธ๋จ์ main ํจ์ ๋ฐํ ์์ ๋ฌต์์ ์ผ๋ก exit() ํจ์๊ฐ ํธ์ถ๋๋ฉด์(์ฆ main ํจ์๋ฅผ ๋ฐํํ๋ ๊ณณ์ C ์ปดํ์ผ๋ฌ๊ฐ exit() ํจ์๋ฅผ ํธ์ถํ๋ ์ฝ๋๋ฅผ ์ฝ์
) ์ข
๋ฃ ์์
์ด ์์๋จ
๋ฌผ๋ก ํ๋ก์ธ์ค๊ฐ ๋น์๋ฐ์ ์ผ๋ก ์ข
๋ฃ๋๊ธฐ๋ ํจ
์์ ๊ฒฝ์ฐ๋ ํ๋ก์ธ์ค๊ฐ ์ฒ๋ฆฌํ ์๋ ๋ฌด์ํ ์๋ ์๋ ์๊ทธ๋์ด๋ ์์ธ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ๊ฐ ํด๋น
์ด๋ค ๋ฐฉ์์ผ๋ก ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋๋ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ๋ ์ผ๋ จ์ ์์
์ด kernel/exit.c์ ์ ์๋ do_exit() ํจ์๋ฅผ ํตํด ์งํ๋จ
- task_struct ๊ตฌ์กฐ์ฒด์ flags ํญ๋ชฉ์ PF_EXITING ํ๋๊ทธ๋ฅผ ์ค์ ํจ.
- del_timer_sync() ํจ์๋ฅผ ํธ์ถํด ์ปค๋ ํ์ด๋จธ๋ฅผ ์ ๊ฑฐํจ. ์ด ํจ์๊ฐ ๋ฐํ๋๋ฉด, ๋๊ธฐ ์ค์ธ ํ์ด๋จธ์ ์คํ ์ค์ธ ํ์ด๋จธ๊ฐ ์๋ค๋ ๊ฒ ๋ณด์ฅ๋จ.
- BSD ๋ฐฉ์์ ํ๋ก์ธ์ค ์ ๋ณด ๊ธฐ๋ก ๊ธฐ๋ฅ ์ฌ์ฉ ์ do_exit() ํจ์๋ acct_update_integrals() ํจ์๋ฅผ ํธ์ถํด ๊ด๋ จ ์ ๋ณด ๊ธฐ๋กํจ.
- exit_mm() ํจ์๋ฅผ ํธ์ถํด ํด๋น ํ๋ก์ธ์ค๊ฐ ๊ฐ์ง๊ณ ์๋ mm_struct๋ฅผ ๋ฐํํจ. ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ์ด ์ฃผ์ ๊ณต๊ฐ ์ฌ์ฉํ์ง ์์ผ๋ฉด(์ด ์ฃผ์ ๊ณต๊ฐ ๊ณต์ ๋์ด ์์ง ์์ผ๋ฉด) ์ปค๋์ ํด๋น ์์ ํด์ ํจ.
- exit_sem() ํจ์๋ฅผ ํธ์ถํจ. ํ๋ก์ธ์ค๊ฐ IPC ์ธ๋งํฌ์ด๋ฅผ ์ป๊ธฐ ์ํด ๋๊ธฐํ๊ณ ์์๋ค๋ฉด, ์ด ์์ ์ ๋๊ธฐ ์ํ๊ฐ ํด์ ๋จ.
- exit_files() ๋ฐ exit_fs() ํจ์๋ฅผ ํธ์ถํด ๊ด๋ จ ํ์ผ ์์ ์ ๋ฐ ํ์ผ์์คํ ์ ์ฐธ์กฐ ํ์๋ฅผ ์ค์. ์ฐธ์กฐ ํ์๊ฐ 0์ด ๋๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ธ์ค๊ฐ ์๋ค๋ ๋ป์ด๋ฏ๋ก ํด๋น ์์์ ๋ฐํํจ.
- ํ์คํฌ์ ์ข ๋ฃ ์ฝ๋๋ฅผ task_struct์ exit_code ํญ๋ชฉ์ ์ ์ฅํจ. exit() ํจ์์์ ์ง์ ํ ๊ฐ, ๋๋ ์ปค๋์ ์ข ๋ฃ ๋ฐฉ์์ ์ํด ์ข ๋ฃ ์ฝ๋ ๊ฐ์ด ๊ฒฐ์ ๋๋ค. ์ด ๊ณณ์ ์ ์ฅ๋ ์ข ๋ฃ ์ฝ๋ ๊ฐ์ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉํ ์ ์์.
- exit_notify() ํจ์๋ฅผ ํธ์ถํด ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์๊ทธ๋ ๋ณด๋ด๊ณ , ํด๋น ํ๋ก์ธ์ค๊ฐ ์ํ ์ค๋ ๋๊ตฐ์ ๋ค๋ฅธ ์ค๋ ๋ ๋๋ init ํ๋ก์ธ์ค๋ฅผ ์์ ํ๋ก์ธ์ค์ ์๋ก์ด ๋ถ๋ชจ๋ก ์ค์ ํจ. task_struct ๊ตฌ์กฐ์ฒด์ exit_state ํญ๋ชฉ์ ํ์คํฌ ์ข ๋ฃ ์ํ๋ฅผ EXIT_ZOMBIE๋ก ์ค์ ํจ.
- do_exit() ํจ์๋ schedule() ํจ์๋ฅผ ํธ์ถํด ์๋ก์ด ํ๋ก์ธ์ค๋ก ์ ํํจ. ์ด์ ์ด ํ๋ก์ธ์ค๋ ์ค์ผ์ค๋ง ๋์์ด ์๋๋ฏ๋ก ์ด ์ฝ๋๊ฐ ์ข ๋ฃ๋๋ ํ์คํฌ๊ฐ ์คํํ๋ ๋ง์ง๋ง ์ฝ๋๊ฐ ๋จ. do_exit() ํจ์๋ ๋ฐํ ๊ณผ์ ์ด ์์.
์ด ์์ ์์ ํ์คํฌ์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ๋ฐํ๋จ(์ด ํ์คํฌ๋ง ํด๋น ์์ ์ฌ์ฉ ์)
์ด ํ์คํฌ๋ ๋ ์ด์ ์คํ ๊ฐ๋ฅํ์ง ์๊ณ (์คํํ ์ฃผ์ ๊ณต๊ฐ๋ ์์ด์ง), EXIT_ZOMBIE ์ํ๊ฐ ๋จ
์ข
๋ฃ๋ ํ์คํฌ๊ฐ ์ฐจ์งํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ ์ปค๋ ์คํ, thread_info ๊ตฌ์กฐ์ฒด, task_struct ๊ตฌ์กฐ์ฒด๊ฐ ์ ๋ถ๋ค
์ด์ ํ์คํฌ๋ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์ ๋ฌ์ด ํ์ํ ์ ๋ณด๋ฅผ ๋ณด๊ดํ๊ธฐ ์ํด์๋ง ์กด์ฌํจ
๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ํด๋น ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ์ปค๋์ด ์ ๋ณด๊ฐ ๋ ์ด์ ํ์ ์๋ค๊ณ ์๋ ค์ฃผ๋ฉด ํ๋ก์ธ์ค๊ฐ ์ฐจ์งํ๊ณ ์๋ ๋๋จธ์ง ๋ฉ๋ชจ๋ฆฌ๋ ์ฐจ์งํ๊ณ ์๋ ๋๋จธ์ง ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐํ๋ผ ์์คํ
์ ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ๋ก ๋์๊ฐ
ํ๋ก์ธ์ค ์์ ์ ์ ๊ฑฐ
do_exit() ํจ์๊ฐ ์๋ฃ๋๊ณ ํ๋ก์ธ์ค๊ฐ ์ข๋น ์ํ๊ฐ ๋์ด ๋ ์ด์ ์คํ ๊ฐ๋ฅํ์ง ์๋๋ผ๋ ํ๋ก์ธ์ค ์์ ์๋ ์ฌ์ ํ ๋จ์
์ด๋ ์ข
๋ฃ ํ์๋ ์์คํ
์ด ์์ ํ๋ก์ธ์ค์ ์ ๋ณด๋ฅผ ์ป์ ์ ์๊ฒ ํด์ฃผ๊ธฐ ์ํจ
๊ฒฐ๊ตญ ํ๋ก์ธ์ค ์ข
๋ฃ๋ฅผ ์ํ ์ ๋ฆฌ์์
๊ณผ ํ๋ก์ธ์ค ์์ ์ ์ ๊ฑฐ ์์
์ ๋ถ๋ฆฌ๋ ๋ณ๋์ ์์
๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ ์์ ํ๋ก์ธ์ค์ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ์ปค๋์ด ํด๋น ์ ๋ณด๊ฐ ํ์ ์๋ค๊ณ ์๋ ค์ฃผ๋ฉด, ์์ ํ๋ก์ธ์ค์ task_struct ๊ตฌ์กฐ์ฒด์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋จ
wait() ๊ณ์ด ํจ์๋ ํ๋์ ๋ณต์กํ wait4() ์์คํ
ํธ์ถ์ ํตํด ๊ตฌํ๋์ด ์์
๊ธฐ๋ณธ์ ์ธ ๋์์ ํจ์๋ฅผ ํธ์ถํ ํ๋ก์ธ์ค์ ๋์์ ์์ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋ ๋๊น์ง ์ ์ง์ํค๋ ๊ฒ, ์ข
๋ฃ๋ ์์ ํ๋ก์ธ์ค์ PID ๊ฐ์ ๋ฐํ๊ฐ์ผ๋ก ๊ฐ์ง
๋ํ ์ข
๋ฃ๋ ์์ ํ๋ก์ธ์ค์ ์ข
๋ฃ ์ฝ๋๋ฅผ ์ ์ฅํ ํฌ์ธํฐ๋ ์ ๊ณตํจ
ํ๋ก์ธ์ค ์์ ์์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฑฐํด์ผ ํ ๋๊ฐ ๋๋ฉด release_task() ํจ์๋ฅผ ํธ์ถํด ๋ค์ ์์ ์ ์ํํจ
- __exit_signal() ํจ์๋ฅผ ํธ์ถํ๊ณ , ์ด ํจ์๋ __unhash_process() ํจ์๋ฅผ ํธ์ถํ๋ฉฐ, ์ด์ด์ detach_pid() ํจ์์์ ํด๋น ํ๋ก์ธ์ค๋ฅผ pidhash์ ํ์คํฌ ๋ฆฌ์คํธ์์ ์ ๊ฑฐํจ.
- __exit_signal() ํจ์๋ ์ข ๋ฃ๋ ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉํ๋ ๋จ์ ์์ ๋ฐํํ๊ณ , ํต๊ณ๊ฐ๊ณผ ๊ธฐํ ์ ๋ณด๋ฅผ ๊ธฐ๋กํจ.
- ํด๋น ํ์คํฌ๊ฐ ์ค๋ ๋๊ตฐ์ ๋ง์ง๋ง ์ค๋ ๋์๋ค๋ฉด ๋ํ ์ค๋ ๋๊ฐ ์ข๋น๊ฐ ๋ ๊ฒ์ด๋ฏ๋ก, release_task() ํจ์๋ ๋ํ ์ค๋ ๋์ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์ด ์ฌ์ค์ ์๋ฆผ
- release_task() ํจ์๋ put_task_struct() ํจ์๋ฅผ ํธ์ถํด ํ๋ก์ธ์ค์ ์ปค๋ ์คํ ๋ฐ thread_info ๊ตฌ์กฐ์ฒด๊ฐ ๋ค์ด ์๋ ํ์ด์ง๋ฅผ ๋ฐํํ๊ณ , task_struct ๊ตฌ์กฐ์ฒด๊ฐ ๋ค์ด ์๋ ์ฌ๋ฉ ์บ์๋ฅผ ๋ฐํํจ
์ด ์์ ์์ ํ๋ก์ธ์ค ์์ ์์ ํด๋น ํ๋ก์ธ์ค์ ์ฐ๊ด๋ ๋ชจ๋ ์์์ด ํด์ ๋จ
๋ถ๋ชจ ์๋ ํ์คํฌ์ ๋๋ ๋ง
๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์์ ํ๋ก์ธ์ค๋ณด๋ค ๋จผ์ ์ข
๋ฃ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ์์ ํ๋ก์ธ์ค์ ๋ถ๋ชจ๋ก ์ง์ ํ๋ ์๋จ ๋ฐ๋์ ํ์ํจ
๊ทธ๋ ์ง ์์ผ๋ฉด, ๋ถ๋ชจ๋ฅผ ์๊ณ ์ข
๋ฃ๋ ํ๋ก์ธ์ค๋ ์์ํ ์ข๋น ํ๋ก์ธ์ค๋ก ๋จ์ ์์คํ
๋ฉ๋ชจ๋ฆฌ ๋ญ๋นํ๊ฒ ๋จ
ํด๊ฒฐ์ฑ
์ ํด๋น ํ๋ก์ธ์ค๊ฐ ์ํ ์ค๋ ๋๊ตฐ์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ก ์ง์ ํ๊ฑฐ๋, ์ด๊ฒ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ init ํ๋ก์ธ์ค๋ฅผ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ก ์ง์ ํ๋ ๊ฒ
do_exit() ํจ์๋ exit_notify() ํจ์๋ฅผ ํธ์ถํ๊ณ , ์ด ํจ์์์ forget_original_parent() ํจ์๋ฅผ ํธ์ถํจ, ์ฌ๊ธฐ์ find_new_reaper() ํจ์๋ฅผ ํธ์ถํ๋๋ฐ, ์ด ๊ณณ์์ ๋ถ๋ชจ ํ๋ก์ธ์ค ์ฌ์ง์ ์ด ์ฒ๋ฆฌ๋จ
static struct task_struct *find_new_reaper(struct task_struct *father)
{
struct pid_namespace *pid_ns = task_active_pid_ns(father);
struct task_struct *thread;
thread = father;
while_each_thread(father, thread) {
if (thread->flags & PF_EXITING)
continue;
if (unlikely(pid_ns->child_reaper == father))
pid_ns->child_reaper = thread;
return thread;
}
if (unlikely(pid_ns->child_reaper == father)) {
write_unlock_irq(&tasklist_lock);
if (unlikely(pid_ns == &init_pid_ns))
panic("Attempted to kill init!");
zap_pid_ns_processes(pid_ns);
write_lock_irq(&tasklist_lock);
// child_reaper ํญ๋ชฉ์ ๊ทธ๋๋ก ๋๊ฑฐ๋ ๊ทธ๋ฅ ์ง์๋ฒ๋ฆด ์ ์์
// children ํฌ์ธํฐ ๋ด์ฉ ์ค์ EXIT_DEAD ์ํ์ธ ํ์คํฌ๊ฐ
// ๋ค์ด์์ ์ ์์ผ๋ฏ๋ก, forget_original_parent() ํจ์๋
// ์ด๋ค์ ์ด๋๊ฐ๋ก ์ฎ๊ฒจ์ผ ํจ
pid_ns->child_reaper = init_pid_ns.child_reaper;
}
return pid_ns->child_reaper;
}
์์ ์ฝ๋๋ ํด๋น ํ๋ก์ธ์ค๊ฐ ์ํ ์ค๋ ๋๊ตฐ์ ๋ค๋ฅธ ํ์คํฌ๋ฅผ ์ฐพ์๋ด
๋ง์ฝ ์ค๋ ๋๊ตฐ์ ๋ค๋ฅธ ํ์คํฌ๊ฐ ์๋ค๋ฉด init ํ๋ก์ธ์ค๋ฅผ ์ฐพ์์ ๋ฐํํจ
์ ์ฝ๋๋ก ์ ๋ถ๋ชจ๋ฅผ ์ฐพ์์ผ๋, ๋ชจ๋ ์์ ํ๋ก์ธ์ค์ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ reaper๋ก ๋ค์ ์ง์ ํด์ฃผ๋ ์์
ํ์ํจ
reaper = find_new_reaper(father);
list_for_each_entry_safe(p, n, &father->children, sibling) {
p->real_parent = reaper;
if (p->parent == father) {
BUG_ON(p->ptrace);
p->parent = p->real_parent;
}
reparent_thread(p, father);
}
๊ทธ ๋ค์ ptrace_exit_finish() ํจ์๋ฅผ ํธ์ถํด ์ถ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์์ ํ๋ก์ธ์ค์ ๋ํด ๋ง์ฐฌ๊ฐ์ง๋ก ๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์ง์ ํด์ค
void exit_ptrace(struct task_struct *tracer)
{
struct task_struct *p, *n;
LIST_HEAD(ptrace_dead);
write_lock_irq(&tasklist_lock);
list_for_each_entry_safe(p, n, &tracer->ptraced, ptrace_entry){
if (__ptrace_detach(tracer, p))
list_add(&p->ptrace_entry, &ptrace_dead);
}
write_unlock_irq(&tasklist_lock);
BUG_ON(!list_empty(&tracer->ptraced));
list_for_each_entry_safe(p, n, &ptrace_dead, ptrace_entry) {
lsit_del_init(&p->ptrace_entry);
release_task(p);
}
}
์์ ํ๋ก์ธ์ค ๋ฆฌ์คํธ์ ์ถ์ ๋ฆฌ์คํธ ๋ ๋ฆฌ์คํธ๊ฐ ๋ง๋ค์ด์ง ๋ฐฐ๊ฒฝ์ด ์์
ํ์คํฌ๊ฐ ์ถ์ ์ํ์ ์๋ ๊ฒฝ์ฐ, ํด๋น ํ๋ก์ธ์ค๋ ๋๋ฒ๊น
ํ๋ก์ธ์ค๋ฅผ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ก ์์ ๋ณ๊ฒฝํจ
๊ทธ๋ฌ๋ ํ์คํฌ์ ์ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋๋ฉด, ๋ค๋ฅธ ํ์ ํ๋ก์ธ์ค์ ๊ฐ์ด ์ ๋ถ๋ชจ ํ๋ก์ธ์ค๋ก ๋์๊ฐ ์ ์์ด์ผ ํจ
์ด์ ์ปค๋์์๋ ์ด๋ฐ ์กฐ์น๊ฐ ํ์ํ ์์ ํ๋ก์ธ์ค๋ฅผ ์ฐพ๊ธฐ ์ํด ์์คํ
์ ๋ชจ๋ ํ๋ก์ธ์ค ์กฐ์ฌํจ
์ด์ ๋ํ ํด๊ฒฐ์ฑ
์ผ๋ก ๋์จ ๊ฒ์ด ์ถ์ ์ํ์ ์๋ ์์ ํ๋ก์ธ์ค ๋ฆฌ์คํธ๋ฅผ ๋ณ๋๋ก ๊ด๋ฆฌํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ
์ด๋ฅผ ํตํด ์์ ํ๋ก์ธ์ค๋ฅผ ์ฐพ์ผ๋ ค๊ณ ๋ชจ๋ ํ๋ก์ธ์ค ๋ฆฌ์คํธ๋ฅผ ๋ค์ง๋ ์์
์ ์๋์ ์ผ๋ก ์์ ๋ ๊ฐ์ ํ๋ก์ธ์ค ๋ฆฌ์คํธ๋ฅผ ํ์ํ๋ ์์
์ผ๋ก ์ค์
๋ถ๋ชจ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ง์ ํ๋ฉด, ์ข๋น ํ๋ก์ธ์ค๊ฐ ๋จ์ ์์ ์ํ์ฑ ์ฌ๋ผ์ง
init ํ๋ก์ธ์ค๋ ์ฃผ๊ธฐ์ ์ผ๋ก wait() ํจ์๋ฅผ ํธ์ถํด ์์ ์๊ฒ ํ ๋น๋ ์ข๋น ํ๋ก์ธ์ค๋ฅผ ์ ๋ฆฌํจ